4
Окна сообщения (MsgBox) и ввода (InputBox ). Объекты Debug (отладка) и Immediate (значения переменных)
Поговорим о функциях, которые помогают программистам. На лекции мы уже знакомились с функцией MsgBox(), которая выводит на экран диалоговое окно. Полный формат функции:
MsgBox(prompt [, buttons] [, title] [, helpfile, context])
1. Prompt - обязательный строковый параметр, который представляет собой сообщение. Допускается сообщение в несколько строк, для чего используются символы возврата каретки (chr(13)) и перевод строки (chr(10)).
2. Buttons - необязательный числовой параметр, равный сумме значений, указывающих на число и тип кнопок, тип значка и модальность окна сообщения. См. подробнее об этом параметре в файле справки.
3. Title - необязательный строковый параметр, который отображается с строке заголовка.
4. Helpfile - необязательный строковый параметр, определяющий имя файла справки, связанного с приложением.
5. Context - необязательный параметр, указывающий на номер раздела из файла справки.
Замечание. Если у окна сообщения указаны оба параметра Helpfile и Context, то пользователь может вызвать справку простым нажатием клавиши F1. Стоит сказать, что создание файла справки является хотя и простой задачей, но изучение этого вопроса выходит за рамки нашего курса.
Замечание. Если использование пиктограмм в функции MsgBox() интуитивно понятен, то вопрос о значениях, возвращаемых ей, довольно туманен. Поймите одно: при кликаньи на любой кнопке в окне сообщения MsgBox() в программу возвращается уникальное число, ради которого и было вызвано это окно. Именно поэтому длинная конструкция MsgBox(prompt, [buttons], ...) в программе присваивается некой переменной - после того, как пользователь кликнул на какой-то кнопке в программе должен произойти анализ значения, возвращенного функцией MsgBox().
Константа Значение Нажатая кнопка vbOk 1 Ok vbCancel 2 Отмена vbAbort 3 Прервать vbRetry 4 Повторить vbIgnore 5 Пропустить vbYes 6 Да vbNo 7 Нет Остается только сказать, что для удобства каждое значение, возвращаемое функцией MsgBox(), связано с именованной константой, и в программе при анализе можно использовать и то и другое. Рассмотрим полный формат функции InputBox(), которая позволяет выводить на экран диалоговое окно, содержащее поле ввода:
InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])
1. Prompt - обязательный строковый параметр, который отображается как сообщение. Допускается сообщение в несколько строк.
2. Title - необязательный строковый параметр, отображаемый в строке заголовка диалогового окна.
3. Default - необязательный строковый параметр, отображаемый в поле ввода по умолчанию.
4. Xpos - необязательный числовой параметр, задающий расстояние по горизонтали между левой границей диалогового окна и левым краем экрана.
5. Ypos - необязательный числовой параметр, задающий расстояние по вертикали между верхней границей диалогового окна и верхним краем экрана.
6. Helpfile, Context - необязательные параметры, выполняющие те же функции, что и аналогичные параметры для функции MsgBox().
Нам совершенно неинтересно, что: в среде VB есть средства, облегчающие разработку приложений. Одним из них является объект Debug, предназначенный для вывода информации в собственное окно во время разработки (или тестирования) приложения. Вы, наверное, уже встречались с ситуацией, когда надо было узнать значение той или иной переменной на определенном этапе работы программы. Простейший способ - это выводить такие значения на форму командой Print, однако VB предлагает для этого специальный объект - Debug (отладчик) с двумя методами: Print (печатать), Assert (приостановление работы). Для наших целей вполне хватит знаний о том, что в любом месте программы мы можете вывести в окно Debug значение любой переменной по правилу:
Debug.Print "X=", XНам совершенно неинтересно, что: для того, чтобы увидеть значения переменных, выведенных в окно Debug, необходимо вызвать окно Immediate Window (горячая клавиша Ctrl+G). Это окно - достаточно мощное средство для вашей работы с вашей программой: вы можете увидеть в нем значение любой переменной.
? value
print value
Кроме того, окно обладает огромным количеством возможностей: 1) копировать (удалять, вставлять) данные из него в буфер; 2) продолжать выполнение программы (!); 3) продолжить выполнение программы в пошаговом режиме; 4) смотреть на выполнение кода в процедурах и функциях, если это подразумевается логикой программы; 5) перезапустить ваше приложение заново и пр. При аварийной остановке программы программист может выяснять значения интересующих его переменных. На рисунке, приведенном выше, видно состояние окна Immediate после того, как в него программно было выведено значение переменной i (равное 44231) и значение суммы 1+2 командами:
Debug.Print "i=", i
Debug.Print 1+2
После этого программа была остановлена сочетанием клавиш Ctrl+Break либо через меню Run | Break (либо вообще завершена) и программист начал выяснять значения интересующих его переменных.
Большой пример. Рассмотрим программу, которая занимается регистрацией пользователя: он вводит данные о себе, а программа проверяет их на корректность и заставляет пользователя вводить данные правильно. Ограничимся только некоторыми данными:
На форме присутствуют шесть меток, в которых находится информация для пользователя о том, какие данные необходимо вводить: фамилия, имя, отчество, год рождения, электронный адрес и метка-заголовок. Совершенно неважно, какие имена будут иметь метки и соответствующие им текстовые окна, поэтому нам подойдут стандартные имена Label1, ..., Label 6, TextBox1, ..., TextBox5. Двум командным кнопкам на форме можно дать значимые имена: cmdReg ("Регистрация"), cmdExit ("Выход").
Разберем алгоритм программы: итак, в идеале пользователь должен ввести в текстовые окна данные, щелкнуть на кнопке "Регистрация" и получить сообщение "Регистрация прошла успешно". Однако, логично предположить, что пользователь может допускать ошибки при вводе информации, в частности:
- не указать свою фамилию, имя или отчество;
- указать заведомо неверный год своего рождения (договоримся, что к таким мы отнесем года, меньшие 1900 или большие текущего);
- указать неправильно свой электронный адрес (договоримся, что к таким мы отнесем любой адрес, не содержащий знак @, т.н. "собака").
Разберемся со структурой программы. С фамилией, именем и отчеством пользователя все достаточно просто: необходимо проверить факт, что пользователь ввел в текстовые окна хотя бы что-нибудь; если нет, то надо вывести сообщение "Надо ввести фамилию (имя, отчество)". Для этого мы будем использовать функцию MsgBox().
Чтобы проанализировать правильный ввод года рождения пользователя необходимо сделать несколько операций: 1) ограничить число вводимых символов в четвертое текстовое окно четырьмя символами; 2) выяснить текущий год; 3) проверить находится ли число, введенное пользователем, между числом 1900 и текущим годом. Чтобы ограничить вводимые символы надо изменить свойство MaxLength элемента Label4 с "0" на "4". Чтобы выяснить текущий год необходимо воспользоваться встроенной функцией Year() и Date(): так как нам текущий год необходим в виде целого числа (кроме того, нам совершенно неинтересен текущий день и месяц), то для целой переменной intTG:
Private Sub Form_Activate()
intTG = Year(Date)
End Sub
Замечание. Так как переменная intTG должна получить значение еще до того, как с ней будет работать процедура cmdReg_Click(), то имеет смысл поместить инициализацию intTG в "самую первую" процедуру Form_Activate(), которая срабатывает при загрузке формы. Кроме того, в случае, если пользователь неправильно введет год своего рождения, заставим его сделать это с помощью функции InputBox() принудительно.
Чтобы проанализировать правильный ввод электронного адреса пользователя, необходимо просмотреть строку в пятом текстовом окне и если в строке присутствует символ "@" (и он не первый, и не последний), то все в порядке; иначе - надо выдать сообщение об ошибке.
Rem Описание переменных и директив проекта Option Explicit Dim intTG As Integer Rem Кнопка "Выход" Private Sub cmdExit_Click() End End Sub Rem Кнопка "Регистрация" Private Sub cmdReg_Click() Dim i As Integer Dim n As Integer Dim flag As Boolean Dim dog As Boolean flag = True dog = False Rem Проверка фамилии, имени, отчества If Text1 <> "" Then If Text2 <> "" Then If Text3 = "" Then i = MsgBox("Необходимо ввести отчество", , "ОШИБКА") flag = False Text3.SetFocus End If Else i = MsgBox("Необходимо ввести имя", , "ОШИБКА") flag = False Text2.SetFocus End If Else i = MsgBox("Необходимо ввести фамилию", , "ОШИБКА") flag = False Text1.SetFocus End If Rem Проверка года рождения i = Val(Text4) While i < 1900 Or i > Year(Date) i = Val(InputBox("Введите год вашего рождения", "ОШИБКА", i)) Text4 = i Wend Rem Проверка электронного адреса n = Len(Text5) For i = 1 To n If Mid(Text5, i, 1) = "@" Then dog = True i = n End If Next i If dog <> True Then i=MsgBox("В электронном адресе должен присутствовать символ @",, "ОШИБКА") flag = False Text5.SetFocus End If If flag Then i=MsgBox("РЕГИСТРАЦИЯ ПРОШЛА УСПЕШНО",vbOKOnly,"Поздравляем") End Sub Rem Процедура активации формы (загрузка) Private Sub Form_Activate() intTG = Year(Date) End SubНекоторые комментарии. Поясним некоторые аспекты программы. Алгоритм проверки корректности данных находится в процедуре cmdReg_Click(). Внутри процедуры находится три условия (на ФИО, год, адрес), каждое из которых в случае невыполнения присваивает логической переменной flag значение false (ложь) и переводит фокус программы на текстовое окно с неправильными данными. Если переменная flag "дожила" до конца процедуры, сохранив свое первоначальное значение - true (истина), то регистрация считается успешной. Внутри процедуры использованы специфические функции и методы:
1) SetFocus - метод, который передает фокус на элемент управления;
2) Val() - функция, переводит строку в число;
3) Year(), Date() - функции, возвращающие соответственно текущие год и дату;
4) Mid() - функция, возвращающая часть строки.
При желании вы можете выяснить полный формат каждой функции (как и многих других) по справке VB.
Задания по лабораторной работе 4
1. Прочитать и законспектировать работу, проверить пример.
2. Разобрать два дополнительных примера (только для тех, у кого есть пособие и дискета с дополнительными примерами).
3. Выбрать любое отчетное задание: "создать программу, в которой..."
1 пользователь вводит фамилию, имя и отчество, а программа корректирует их, делая ФИО с больших букв или оставляя без изменений; 2 пользователь вводит два числа (радиус, число "пи"), а программа рассчитывает площадь круга; 3 пользователь вводит строку в одно текстовое поле, а во второе программа выводит эту строку "задом наоборот", причем, если введенная строка является палиндромом (т.е. читается одинаково в обе стороны), то программа сообщает об этом пользователю; 4 пользователь вводит цену товара, его количество и процент пошлины, а получает чистую прибыль, причем программа не работает в том случае, если количество товара меньше 100 единиц и выдает предупреждение, если пошлина больше 50 процентов; 5 происходит регистрация пользователя по шагам: ФИО, пароль (с подтверждением), название компании, название программы - в результате чего пользователь получает сгенерированный код доступа.